/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "节点/节点.h"

#include "节点/插座/C_物体插座.h"
#include "节点/插座/list/list矢量插座.h"



class C_矩阵变换节点 : public C_节点基类 {
public:
	C_矩阵变换节点(S_设备环境& ctx);
	~C_矩阵变换节点();

	//S_Props		m_计算方式;
	S_Props		m_是否改变原数据;
	S_Props		m_执行代码;

	bool	f_update();
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);

	void	f_物体变换(S_物体* ob, const vec3& loc, const vec3& rot, const vec3& scal, uint32 offset);
	void	f_网格变换(S_Mesh* ob, const vec3& loc, const vec3& rot, const vec3& scal, uint32 offset);
	void	f_坐标变换(vec3& outData, const vec3& loc, const vec3& rot, const vec3& scal, uint32 offset);
};

C_节点基类* f_node_创建矩阵变换节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载矩阵变换节点(S_设备环境& ctx, FILE* f);
void f_node_保存矩阵变换节点(C_节点基类* n, FILE* f);




class C_矩阵计算节点 : public C_节点基类 {
public:
	C_矩阵计算节点(S_设备环境& ctx);
	~C_矩阵计算节点();

	S_Props		m_计算方式;
	S_Props		m_是否改变原数据;
	S_Props		m_执行代码;

	bool	f_update();
	std::string	f_编译(C_节点基类* rn, std::string& 声明, std::vector<std::string>& 定义, std::string& 释放);
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建矩阵计算节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类*	f_node_加载矩阵计算节点(S_设备环境& ctx, FILE* f);
void		f_node_保存矩阵计算节点(C_节点基类* n, FILE* f);



class C_矩阵转换节点 : public C_节点基类 {
public:
	C_矩阵转换节点(S_设备环境& ctx);
	~C_矩阵转换节点();

	S_Props		m_转换类型;

	bool	f_update();
	void    f_getStr(std::vector<std::vector<std::wstring>>& 文本);
	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_创建旋转矩阵转欧拉角节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载旋转矩阵转欧拉角节点(S_设备环境& ctx, FILE* f);
void		f_node_保存旋转矩阵转欧拉角节点(C_节点基类* n, FILE* f);



class C_顶点变换节点 : public C_节点基类 {
public:
	C_顶点变换节点(S_设备环境& ctx);
	~C_顶点变换节点();

	bool	f_update();
	std::string DEF_节点编译函数;

	void    f_Copy(const C_节点基类* node);
};

C_节点基类* f_node_创建顶点变换节点(S_设备环境& ctx, C_节点树* 子节点树);
C_节点基类* f_node_加载顶点变换节点(S_设备环境& ctx, FILE* f);
void        f_node_保存顶点变换节点(C_节点基类* n, FILE* f);









